#这是一个滑雪游戏
import pygame,easygui,sys,random

choices0=['开始','关闭']
isStartGame = easygui.buttonbox('''这是一个滑雪游戏\n键盘操作：左（A）、右（D）\n退出：ESC''',"信息提示",choices0)
if isStartGame==choices0[1]:sys.exit()

#滑雪者在不同方向上的不同动作图片
skierIamges=["skier_down.png","skier_right1.png","skier_right2.png","skier_left2.png","skier_left1.png"]

#滑雪者图片类
class SkierClass(pygame.sprite.Sprite):
    #创建滑雪者
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image=pygame.image.load("skier_down.png")
        self.rect=self.image.get_rect()
        self.rect.center=[320,100]
        self.angle=0

    #滑雪者转向(载入新的图片且改变速度)
    def turn(self,direction):
        self.angle=self.angle+direction
        if self.angle<-2:self.angle=-2
        if self.angle>2:self.angle=2
        center=self.rect.center
        self.image=pygame.image.load(skierIamges[self.angle])
        self.rect=self.image.get_rect()
        self.rect.center=center
        speed=[self.angle,6-abs(self.angle)*2]
        return speed

    #滑雪者左右移动
    def move(self,speed):
        self.rect.centerx=self.rect.centerx+speed[0]
        if self.rect.centerx<20:self.rect.centerx=20
        if self.rect.centerx>620:self.rect.centerx=620


#障碍图片类（树和旗子）
class ObstacleClass(pygame.sprite.Sprite):
    def __init__(self,image_file,location,type):
        pygame.sprite.Sprite.__init__(self)
        self.image_file=image_file
        self.image=pygame.image.load(image_file)
        self.location=location
        self.rect=self.image.get_rect()
        self.rect.center=location
        self.type=type
        self.passed=False

    #让场景向上滚动
    def scroll(self,t_ptr):
        self.rect.centery=self.location[1]-t_ptr

#创建地图包含树和小旗子(在屏幕创建640*640的地图；使用64*64的像素块，避免对象靠的太近)
def create_map(start,end):
    obstacles=pygame.sprite.Group()
    gates=pygame.sprite.Group()
    locations=[]
    for i in range(10):
        row=random.randint(start,end)
        col=random.randint(0,9)
        location=[col*64+20,row*64+20]
        if not (location in locations):
            locations.append(location)
            type=random.choice(["tree","flag"])
            if type =="tree":img="skier_tree.png"
            elif type=="flag":img="skier_flag.png"
            obstacle=ObstacleClass(img,location,type)
            obstacles.add(obstacle)
    return obstacles

#重新绘制屏幕，包含所有图片
def animate():
    screen.fill([255,255,255])
    pygame.display.update(obstacles.draw(screen))
    screen.blit(skier.image,skier.rect)
    screen.blit(score_text,[10,10])
    pygame.display.flip()

def updateObstacleGroup(map0,map1):
    obstacles=pygame.sprite.Group()
    for ob in map0:obstacles.add(ob)
    for ob in map1:obstacles.add(ob)
    return obstacles

#参数初始化
pygame.init()
screen=pygame.display.set_mode([640,640])
clock=pygame.time.Clock()
skier=SkierClass()
speed=[0,6]
map_position=0
points=0
map0=create_map(20,29)
map1=create_map(10,19)
activeMap=0
obstacles=updateObstacleGroup(map0,map1)
font=pygame.font.Font(None,50)
choices=['继续','关闭']

#程序逻辑
isLoop=True
while isLoop:
    clock.tick(30)
    for event in pygame.event.get():
        if event.type==pygame.QUIT:sys.exit()
        if event.type==pygame.KEYDOWN:
            if event.key==pygame.K_ESCAPE:sys.exit()
            if event.key==pygame.K_LEFT or event.key==pygame.K_a:
                speed=skier.turn(-1)
            elif event.key==pygame.K_RIGHT or event.key==pygame.K_d:
                speed=skier.turn(1)
    skier.move(speed)
    map_position+=speed[1]

    if map_position>=640 and activeMap==0:
        activeMap=1
        map0=create_map(20,29)
        obstacles=updateObstacleGroup(map0,map1)
    if map_position>=1280 and activeMap==1:
        activeMap=0
        for ob in map0:
            ob.location[1]=ob.location[1]-1280
        map_position=map_position-1280
        map1=create_map(10,19)
        obstacles=updateObstacleGroup(map0,map1)

    for obstacle in obstacles:
        obstacle.scroll(map_position)

    #检测碰撞到树和获得的旗子
    hit=pygame.sprite.spritecollide(skier,obstacles,False)
    if hit:
        if hit[0].type=="tree" and not hit[0].passed:
            points=points-100
            skier.image=pygame.image.load("skier_crash.png")
            animate()
            pygame.time.delay(1000)
            skier.image=pygame.image.load("skier_down.png")
            skier.angle=0
            speed=[0,6]
            hit[0].passed=True
            isLoop=False
            curSelected = easygui.buttonbox("是否继续？","信息提示",choices)
            if curSelected==choices[0]:
                isLoop=True
            if curSelected==choices[1]:
                isLoop=False
                score_text=font.render("再见!",1,(0,0,0))
            pygame.time.delay(3000)


        elif hit[0].type=="flag" and not hit[0].passed:
            points+=10
            obstacles.remove(hit[0])

    score_text=font.render("Score:"+str(points),1,(0,0,0))
    animate()
                







        







